home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / quake.zip / TORNADO.ZIP / STORMBMB.QC < prev    next >
Text File  |  1997-04-30  |  8KB  |  274 lines

  1. //////////////////////////////////////////////////////////
  2. // STORM_BOMB - Version 1.1                                //
  3. // 3/12/97 - John Mason                                    //
  4. // jwmason1@ix.netcom.com                                //
  5. //                                                        //
  6. // 1.0 - 12/12/96 - Initial release                        //
  7. //                                                      //
  8. // 1.1 - 04/30/97 - Fixed the following problems:        //
  9. //        Chaser bombs going through walls                //
  10. //////////////////////////////////////////////////////////
  11.                                                           
  12. float fBombLife;
  13. float fPlayedWav;
  14. float fNumBombs;
  15.  
  16. void() W_LaunchStormBomb;
  17. void() StormBombTouch;
  18. void() StormBombRiser;
  19. void() StormBombSplit;
  20. void(entity targ, vector org) StormBombChaser;
  21. void() StormBombChaserTouch;
  22. void() StormBombChaserLightning;
  23. void() StormBombChaserExplode;
  24.  
  25. void() W_LaunchStormBomb =
  26. {
  27.     local entity sb_grenade;
  28.     
  29.     fBombLife = 5;
  30.     fPlayedWav = 0;
  31.     fNumBombs = 0;
  32.  
  33.     // If player has less than 5 rockets, don't fire Storm Bomb
  34.     if ((self.ammo_rockets < 5) || !(self.weapon & (IT_GRENADE_LAUNCHER | IT_STORM_BOMB)))
  35.     {
  36.         sprint(self,"Not enough ammo to launch Storm Bomb\n");
  37.         return;
  38.     }
  39.  
  40.     // Subtract 5 rockets from players ammo
  41.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
  42.     
  43.     sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  44.     
  45.     // Set the recoil angle
  46.     self.punchangle_x = -2;
  47.  
  48.     // Spawn the grenade - standard id style
  49.     sb_grenade = spawn ();
  50.     sb_grenade.owner = self;
  51.     sb_grenade.movetype = MOVETYPE_BOUNCE;
  52.     sb_grenade.solid = SOLID_BBOX;
  53.     sb_grenade.classname = "sb_grenade";
  54.         
  55.     // Set the missile speed    
  56.     makevectors (self.v_angle);
  57.  
  58.     if (self.v_angle_x)
  59.         sb_grenade.velocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10;
  60.     else
  61.     {
  62.         sb_grenade.velocity = aim(self, 10000);
  63.         sb_grenade.velocity = sb_grenade.velocity * 600;
  64.         sb_grenade.velocity_z = 200;
  65.     }
  66.                 
  67.     sb_grenade.avelocity = '300 300 300';
  68.     sb_grenade.angles = vectoangles(sb_grenade.velocity);
  69.     sb_grenade.touch = StormBombTouch;
  70.                    
  71.     // Set Duration                   
  72.     sb_grenade.nextthink = time + 1;
  73.     sb_grenade.think = StormBombRiser;
  74.  
  75.     setmodel (sb_grenade, "progs/grenade.mdl");
  76.     setsize (sb_grenade, '0 0 0', '0 0 0');            
  77.     setorigin (sb_grenade, self.origin);
  78. };
  79.  
  80. void() StormBombTouch =
  81. {
  82.     // Did the grenade hit a someone?
  83.     if (other.takedamage)
  84.     {
  85.         sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  86.         return;
  87.     }
  88.     else
  89.     {
  90.         sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  91.         if (self.velocity == '0 0 0')
  92.             self.avelocity = '0 0 0';
  93.     }    
  94. };
  95.  
  96. void() StormBombRiser=
  97. {
  98.     local entity sb_riser;
  99.  
  100.     // Make the SBGrenade stop
  101.     self.movetype=MOVETYPE_NONE;
  102.     self.velocity='0 0 0';
  103.     
  104.     // Draw a tiny explosion (no particles)        
  105.     setmodel(self, "progs/s_explod.spr");
  106.     s_explode1();
  107.  
  108.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  109.  
  110.     // Spawn and animate the 'second stage'
  111.     sb_riser = spawn();
  112.     sb_riser.owner = self.owner;
  113.     sb_riser.movetype = MOVETYPE_FLYMISSILE;
  114.     sb_riser.solid = SOLID_BBOX;
  115.     sb_riser.classname = "sb_riser";
  116.  
  117.     // Set speed
  118.     sb_riser.velocity = '0 0 100';
  119.     sb_riser.angles = vectoangles(sb_riser.velocity);
  120.     sb_riser.touch = StormBombTouch;
  121.  
  122.     // Set Duration
  123.     sb_riser.nextthink = time + 1;
  124.     sb_riser.think = StormBombSplit;
  125.  
  126.     setmodel (sb_riser, "progs/missile.mdl");
  127.     setsize (sb_riser, '0 0 0', '0 0 0');
  128.     setorigin (sb_riser, self.origin);
  129. };
  130.  
  131. void() StormBombSplit =
  132. {
  133.     local entity head;
  134.  
  135.     // Make the SBRiser stop
  136.     self.movetype=MOVETYPE_NONE;
  137.     self.velocity='0 0 0';
  138.     
  139.     // Draw a tiny explosion (no particles)        
  140.     setmodel(self, "progs/s_explod.spr");
  141.     s_explode1();
  142.  
  143.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  144.                       
  145.     head = findradius(self.origin, 1500);                      
  146.     while (head)                      
  147.     {
  148.         if (visible(head))
  149.             if ((head.flags & FL_MONSTER) || (head.classname == "player"))
  150.                 if (head != self.owner)
  151.                        StormBombChaser(head, self.origin);
  152.  
  153.         head = head.chain;
  154.     }    
  155. };
  156.  
  157. void(entity targ, vector org) StormBombChaser =
  158. {
  159.     local entity sb_chaser;
  160.     local vector vdestdelta;
  161.     local float len, traveltime;
  162.  
  163.     fNumBombs = fNumBombs + 1;
  164.     
  165.     // Spawn and animate the 'second stage'
  166.     sb_chaser = spawn();
  167.     sb_chaser.owner = self.owner;
  168.     sb_chaser.movetype = MOVETYPE_FLYMISSILE;
  169.     sb_chaser.solid = SOLID_BBOX;
  170.     sb_chaser.classname = "sb_chaser";
  171.     sb_chaser.enemy = targ;
  172.             
  173.     // Set speed
  174.     vdestdelta = targ.origin - org;
  175.     len = vlen(vdestdelta);
  176.     traveltime = len / 150;
  177.     
  178.     sb_chaser.velocity = vdestdelta * (1/traveltime);
  179.     sb_chaser.velocity_z = 0;
  180.     
  181.     // missile.velocity = '0 0 0';
  182.     sb_chaser.angles = vectoangles(sb_chaser.velocity);
  183.     sb_chaser.touch = StormBombChaserTouch;
  184.         
  185.     // Set Duration
  186.     sb_chaser.nextthink = time + 0.1;
  187.     sb_chaser.think = StormBombChaserLightning;
  188.         
  189.     setmodel (sb_chaser, "progs/missile.mdl");
  190.     setsize (sb_chaser, '0 0 0', '0 0 0');
  191.     setorigin (sb_chaser, self.origin);
  192. };
  193.  
  194. void() StormBombChaserTouch =
  195. {       
  196.     sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  197.  
  198.     if (other == world)
  199.     {    
  200.         self.velocity == '0 0 0';
  201.         self.avelocity = '0 0 0'; 
  202.         self.movetype = MOVETYPE_NONE;
  203.         self.touch = SUB_Null;
  204.     }
  205. };
  206.  
  207. void() StormBombChaserLightning =
  208. {
  209.     local vector vdestdelta;
  210.     local float len, traveltime;
  211.     
  212.     if (fNumBombs != 0)
  213.         fBombLife = fBombLife - (0.05 / fNumBombs);
  214.     else        
  215.         fBombLife = 0;
  216.         
  217.     if (fBombLife >= 1)
  218.     {
  219.         // Old try - setting origin - not too good, huh ?! (Monsters get stuck in walls and shit)
  220.         // trace_ent.origin = trace_ent.origin + (0.1 * (self.origin - trace_ent.origin));
  221.                         
  222.         vdestdelta = self.origin - self.enemy.origin;
  223.         len = vlen(vdestdelta);
  224.         traveltime = len / 200;
  225.  
  226.         self.enemy.flags = self.enemy.flags - (self.enemy.flags & FL_ONGROUND);
  227.         self.enemy.velocity = vdestdelta * (1/traveltime);
  228.                 
  229.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  230.         WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  231.         WriteEntity (MSG_BROADCAST, self);
  232.         WriteCoord (MSG_BROADCAST, self.origin_x);
  233.         WriteCoord (MSG_BROADCAST, self.origin_y);
  234.         WriteCoord (MSG_BROADCAST, self.origin_z);
  235.         WriteCoord (MSG_BROADCAST, self.enemy.origin_x);
  236.         WriteCoord (MSG_BROADCAST, self.enemy.origin_y);
  237.         WriteCoord (MSG_BROADCAST, self.enemy.origin_z);
  238.                 
  239.         // No damage done by lightning, just used to disable target
  240.         LightningDamage(self.origin, self.enemy.origin, self, 0);
  241.  
  242.         self.nextthink = time + 0.05;
  243.         self.think = StormBombChaserLightning;
  244.         self.touch = StormBombChaserTouch;
  245.         
  246.         if ((fBombLife < 2) && (fPlayedWav == 0))
  247.         {
  248.             sound (self.owner, CHAN_AUTO, "shitin.wav", 1, ATTN_NORM);
  249.             fPlayedWav = 1;
  250.         }
  251.     }                         
  252.     else
  253.         StormBombChaserExplode();
  254. };                       
  255.  
  256. void() StormBombChaserExplode = 
  257. {
  258.     T_RadiusDamage (self, self.owner, 150, world);
  259.  
  260.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  261.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  262.     WriteCoord (MSG_BROADCAST, self.origin_x);
  263.     WriteCoord (MSG_BROADCAST, self.origin_y);
  264.     WriteCoord (MSG_BROADCAST, self.origin_z);
  265.  
  266.     BecomeExplosion ();
  267. };
  268.  
  269. //////////////////////////////////////////////////////////
  270. //                                                        //
  271. // End of STORM_BOMB code                                //
  272. //                                                        //
  273. //////////////////////////////////////////////////////////
  274.